﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MaquinaJMG.GUI.Contrato;
using Datos.Entidades;
using Logica.Comandos.AdministracionUsuarios;
using Datos.Entidades.FabricaEntidades;
using Logica.Comandos;
using Logica.FabricaLogica;
using System.Windows.Forms;
using Logica.Comandos.ComandosAdministracionEvento;
using Logica.Comandos.ComandoXML;
using System.Xml;
using Logica.Comandos.ComandoAdministracionApuesta;
namespace MaquinaJMG.GUI.Presentador
{
    public class PresentadorExportarApuestas
    {
         private IContratoExportarApuestas _evento;
        List<Entidad> listaUsuarios = new List<Entidad>();
        private List<Entidad> misEventosCategorias = new List<Entidad>();
        // <summary>
        /// presentador para hacer llamada a las interfaces de exportarApuesta
        /// </summary>

        public PresentadorExportarApuestas(IContratoExportarApuestas evento)
        {
            _evento = evento;
        }

        // <summary>
        /// procedimiento que consulta medios de exportacion
        /// </summary>
        


        public void ConsultarMetodoExportacion()
        {
            Comando comando = FabricaComandoMaquina.CrearComandoListarTodasMaquinas();
            comando.Ejecutar();
            listaUsuarios = comando.ListaEntidad;
            _evento.metodo.Items.Add("Pendrive");
            if ((listaUsuarios.ElementAt(0) as Maquina).Estatus1 == 1)
            {
                _evento.metodo.Items.Add("En Linea");

            }
            _evento.metodo.SelectedIndex = 0;

           
        }

        // <summary>
        /// procedimiento que llama al tipo de exportacion
        /// </summary>
        public void exportar(string ruta) 
        {
            if (_evento.metodo.SelectedIndex==0)
                exportarPendrive(ruta);
            else
            {
                transmitirEnLinea();

            }
        }
        // <summary>
        /// procedimiento que genera archivo xml pendrive
        /// </summary>
        /// <parm>ruta</parm> ruta destino del archivo generado
        public void exportarPendrive(string ruta)
        {
            Comando comando = FabricaComandoXML.CrearComandoBuscarXML();

            comando.Ejecutar();
            listaUsuarios = comando.ListaEntidad;
            Console.WriteLine(ruta);
            XmlTextWriter myXmlTextWriter = new XmlTextWriter(ruta, System.Text.Encoding.UTF8);
            myXmlTextWriter.Formatting = Formatting.Indented;
            myXmlTextWriter.WriteStartDocument(false);
            myXmlTextWriter.WriteStartElement("registroApuestas", null);
            

            for (int i = 0; i < listaUsuarios.Count; i++)
            {

                myXmlTextWriter.WriteStartElement("Apuesta"); 
                myXmlTextWriter.WriteElementString("idAcceso", null, (listaUsuarios.ElementAt(i) as Acceso).IdAcceso.ToString());
                myXmlTextWriter.WriteElementString("fecha", null, (listaUsuarios.ElementAt(i) as Acceso).Fecha.ToString());
                myXmlTextWriter.WriteElementString("hora", null, (listaUsuarios.ElementAt(i) as Acceso).Hora.ToString());
                myXmlTextWriter.WriteElementString("minuto", (listaUsuarios.ElementAt(i) as Acceso).Min.ToString());
                myXmlTextWriter.WriteElementString("montoApostado", null, (listaUsuarios.ElementAt(i) as Acceso).MontoApostado.ToString());
                myXmlTextWriter.WriteElementString("idEvento", null, (listaUsuarios.ElementAt(i) as Acceso).FkIdEvento.ToString());
                myXmlTextWriter.WriteElementString("idHistorialParticipante", null, (listaUsuarios.ElementAt(i) as Acceso).FkIdHistorialParticipante.ToString());
                myXmlTextWriter.WriteElementString("idMaquina", null, (listaUsuarios.ElementAt(i) as Acceso).FkIdHistorialParticipante.ToString());
                myXmlTextWriter.WriteEndElement(); 
                Comando comandoModificar = FabricaComandoXML.CrearComandoModificarAcceso((listaUsuarios.ElementAt(i) as Acceso).IdAcceso);
                comandoModificar.Ejecutar();
            }

            myXmlTextWriter.WriteEndElement();
            myXmlTextWriter.Flush();
            myXmlTextWriter.Close();
            Console.ReadLine();
        }

        public int ConsultarMaquina()
        {
            Comando comando = FabricaComandoApuesta.ObtenerComandoMostrarMaquina();
            comando.Ejecutar();
            misEventosCategorias = comando.ListaEntidad;
            int id = (misEventosCategorias.ElementAt(0) as Maquina).IdMaquina;
            return id;

        }

        public void transmitirEnLinea()
        {
            ServicioWebMaquina.ServicioWeb servicio = new ServicioWebMaquina.ServicioWeb();
            bool respuesta;
            // verificar si la maquina puede transmitir
            int id = ConsultarMaquina();
            respuesta= servicio.VerificacionEstatusMaquina(id);

            if (respuesta == true)
            {
                // Buscar apuestas sin transmitir
                Comando comando = FabricaComandoApuesta.ObtenerComandoBuscarApuestas();
                (comando as ComandoBuscarApuestas).Ejecutar();
                listaUsuarios = comando.ListaEntidad;
                if (listaUsuarios.Count!=0)
                {



                    for (int i = 0; i < listaUsuarios.Count; i++)
                    {

                        int idAcceso = ((listaUsuarios.ElementAt(i) as Acceso).IdAcceso);

                        int minuto = ((listaUsuarios.ElementAt(i) as Acceso).Min);
                        string fecha = ((listaUsuarios.ElementAt(i) as Acceso).Fecha);
                        //   DateTime dt = Convert.ToDateTime(fecha);
                        long montoApostado = ((listaUsuarios.ElementAt(i) as Acceso).MontoApostado);
                        int idEvento = ((listaUsuarios.ElementAt(i) as Acceso).FkIdEvento);

                        int idHistorialParticipante = ((listaUsuarios.ElementAt(i) as Acceso).FkIdHistorialParticipante);
                        int idMaquina = ((listaUsuarios.ElementAt(i) as Acceso).FkIdMaquina);
                        int hora = ((listaUsuarios.ElementAt(i) as Acceso).Hora);




                        string exito = servicio.CargaDeApuesta(idAcceso, fecha, hora, minuto, montoApostado, idEvento, idHistorialParticipante, idMaquina);
                        _evento.Mensaje.Text = exito;

                        Comando comandoModificar = FabricaComandoXML.CrearComandoModificarAcceso((listaUsuarios.ElementAt(i) as Acceso).IdAcceso);
                        comandoModificar.Ejecutar();


                    }

                    _evento.Mensaje.Text = "Trasmision exitosa";
                }
                else {

                    _evento.Mensaje.Text = "No hay apuestas para ser transmitidas";
                
                }
            }
            else {

                _evento.Mensaje.Text = "La maquina se encuentra inactiva";
            }
        }
    }

    
}
